package com.caishi.lkx.exam.service;

import com.caishi.lkx.common.ienum.ClientType;
import com.caishi.lkx.exam.model.CategoryModel;
import com.caishi.lkx.exam.vo.SpecialConditionVo;
import com.zzw.common.entity.BaseService;
import com.zzw.common.exception.BizException;
import com.zzw.common.service.NameService;
import com.zzw.common.service.service.ITreeModelService;
import com.zzw.common.service.service.SortService;

import com.caishi.lkx.exam.ienum.type.ColumnType;

import com.caishi.lkx.order.CommonAssetsService;

import java.util.List;

public interface ICategoryService extends BaseService<CategoryModel, Long>,
        NameService<CategoryModel, Long>,
        SortService<CategoryModel>,
        ITreeModelService<CategoryModel, Long>,
        CommonAssetsService<CategoryModel, Long> {
    /**
     * 根据科目ids批量获取科目名称
     *
     * @param categoryIds
     * @return
     */
    default String queryNames(List<Long> categoryIds) {
        return String.join(",", getNameListByIds(categoryIds));
    }

    /**
     * 根据科目ids批量获取科目名称
     *
     * @param collect
     * @return
     */
    List<String> getNameListByIds(List<Long> collect);

    /**
     * 获取科目是否有栏目
     *
     * @param categoryId
     * @return
     */
    boolean haveColumn(Long categoryId);

    /**
     * 查询科目下有多少章节练习试题
     *
     * @return
     */
    int fetchCategoryQuestionCount(Long categoryId);

    /**
     * 科目下所有试题数量  即使不包含在集合中
     *
     * @param categoryId
     * @return
     */
    int allQuestionCount(Long categoryId);


    /**
     * 判断当前请求是否有科目权限
     *
     * @param userGroupId  用户的机构id
     * @param localGroupId 当前位置机构id
     * @param userId       用户id
     * @param categoryId   科目id
     * @return
     */
    boolean currentHaveAuth(Long userGroupId, Long localGroupId, String userId, Long categoryId, ClientType clientType) throws BizException;

    /**
     * 获取用户有权限的科目
     *
     * @param userId
     * @return
     */
    List<Long> userHaveCategory(String userId);

    /**
     * 获取用户有权限的科目，包括有权限科目对应的父级科目
     *
     * @param userId
     * @return
     */
    List<Long> userHaveCategoryTree(String userId);

    /**
     * 查询科目下关联的试题ids
     *
     * @param categoryId
     * @return
     */
    List<String> categoryRelationQuestionIds(Long categoryId);

    /**
     * 科目试题组合成集合的条件
     *
     * @param categoryId
     * @return
     */
    SpecialConditionVo categoryGenerateCollectCondition(Long categoryId, List<String> inIds);

    /**
     * 过滤掉空的试卷库 科目
     *
     * @param list
     * @return
     */
    List<CategoryModel> filteringPaper(List<CategoryModel> list, Boolean onlyLeaf);

    /**
     * 根据叶子节点获取科目路径
     *
     * @param cid 科目id
     * @return
     */
    List<String> categoryByLeafPath(Long cid);

    /**
     * 获取科目下对应栏目类型所有的configId
     *
     * @param categoryId
     * @param columnType
     * @return
     */
    List<String> columnRelationCollectionByCategory(Long categoryId, ColumnType columnType);
}
